package com.shoping.web.component.processor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

/**
 * 这个接口是beanFactory的扩展接口，调用时机在 spring 在读取beanDefinition信息之后，实例化 test 之前。
 * <p>
 * 在这个时机，用户可以通过实现这个扩展接口来自行处理一些东西，比如修改已经注册的beanDefinition的元信息。
 * @author zengweilong
 */
@Slf4j
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        log.info("MyBeanFactoryPostProcessor 执行了");
        int count = beanFactory.getBeanDefinitionCount();
        System.out.println("当前beanFactory中有" + count + " 个Bean");
        // 修改teacherService的值
        BeanDefinition bd = beanFactory.getBeanDefinition("teacherService");
        bd.getPropertyValues().addPropertyValue("remark", "你大爷");
        // 这里千万别尝试通过ApplicationContext获取Bean,获取后Bean将无法进行IOC属性注入和初始化,最后可能造成属性 无法注入导致NPE
    }

}